﻿#define  _CRT_SECURE_NO_WARNINGS 1


//#include<stdio.h>
//int main()
//{
//	int a[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, * p[4], i;
//	for (i = 0; i < 4; i++)
//		p[i] = &a[i * 3];
//	printf("%d\n",p[3][2]);    12  p[1]指向4的地址，p[2]指向7的地址,p[3]指向10的地址
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	char a = 'a', b;
//	printf("%c,", ++a);
//	printf("%c\n", b = a++);      // b,b
//	return 0;
//}
//
//#include<stdio.h>
//int main()
//{
//	int x;
//	(x= 4 * 5, x * 5), x + 5;
//	printf("%d", x);
//	return 0;
//}


//#include<stdio.h>
//int judge(int n)
//{
//    int temp = n;
//    while (temp)
//    {
//        int a = temp % 10;
//        if (a == 0||n % a != 0)      //a又可能为0，而且判断条件要放在前面，被除数不能为0，否者会运行超时
//        {
//            return 0;
//        }
//        temp = temp / 10;
//    }
//    return 1;
//}
//int main()
//{
//	int i = 0;
//	for (i = 1; i <= 55; i++)
//	{
//        if (judge(i))
//            printf("%d ", i);
//	}
//	return 0;
//}


//自除数
//自除数 是指可以被它包含的每一位数整除的数。
//例如，128 是一个 自除数 ，因为 128 % 1 == 0，128 % 2 == 0，128 % 8 == 0。
//自除数 不允许包含 0 。
//给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数 。
//来源：力扣（LeetCode）

//int judge(int n)
//{
//    int m = n;
//    while (n)
//    {
//        int a = n % 10;
//        if (a == 0 || m % a != 0)
//        {
//            return 0;
//        }
//        n = n / 10;
//    }
//    return 1;
//}
//int* selfDividingNumbers(int left, int right, int* returnSize) {
//    *returnSize = 0;
//    int* arr = (int*)malloc(sizeof(int) * (right - left));
//    int i = 0;
//    for (i = left; i <= right; i++)
//    {
//        if (judge(i))
//        {
//            arr[(*returnSize)++] = i;
//        }
//    }
//    return arr;
//}



//除自身以外数组的乘机（左右乘积列表）
//给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
//题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
//请不要使用除法，且在 O(n) 时间复杂度内完成此题。
//来源：力扣（LeetCode）


//int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//    int* answer = (int*)malloc(sizeof(int) * numsSize);
//    int L[numsSize], R[numsSize];
//    L[0] = 1;
//    int i = 0;
//    for (i = 1; i < numsSize; i++)
//    {
//        L[i] = nums[i - 1] * L[i - 1];
//    }
//    R[numsSize - 1] = 1;
//    for (i = numsSize - 2; i >= 0; i--)
//    {
//        R[i] = R[i + 1] * nums[i + 1];
//    }
//    for (i = 0; i < numsSize; i++)
//    {
//        answer[i] = L[i] * R[i];
//    }
//    *returnSize = numsSize;
//    return answer;
//}


//#include<stdio.h>
//int func(int x)
//{
//	int count = 0;
//	while (x)
//	{
//		count++;
//		x = x & (x - 1);//与运算
//	} 
//	return count;
//}
//int main()
//{
//	//printf("%d", func(-1));  32
//	int count = 0;
//	int x = -1;
//	while (x)
//	{
//		count++;
//		x = x >> 1;
//	}
//	printf("%d", count);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int w = 1, x = 2, y = 3, z = 4;
//	int a=w < x ? w : y < z ? y : z;
//	printf("%d", a);
//	return 0;
//}
//
//#include<stdio.h>
//int main()
//{
//	int a = 1, b = 2, m = 0, n = 0, k;
//	k = (n = b < a) && (m = a);
//	n = b < a;
//	printf("%d", n);
//	printf("%d,%d\n", k, m);
//	return 0;
//}

//不用加减乘除做加法
// 
//int Add(int num1, int num2) {
//    while (num2 != 0)//进位为0时，跳出循环
//    {
//       //num2可以表示为进位，
        //循环的意义：循环将进位加到num1值上；
//        int sum = num1 ^ num2;   // 非进位求和
//        int temp = (num1 & num2) << 1;   //计算出进位；
//        num1 = sum;
//        num2 = temp;
//    }
//    return num1;
//}


//找到所有数组中消失的元素
//给你一个含 n 个整数的数组 nums ，其中 nums[i] 在区间[1, n] 内。请你找出所有在[1, n] 范围内但没有出现在 nums 中的数字，并以数组的形式返回结果。
//来源：力扣（LeetCode）

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
    int* result = (int*)malloc(sizeof(int) * (numsSize + 1));//申请空间，作为简易哈希表
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        result[nums[i]] = 1;//记录出现元素
    }
    *returnSize = 0;
    for (i = 1; i <= numsSize; i++)
    {
        if (result[i] != 1)
            result[(*returnSize)++] = i;//对为出现的元素保存输出
    }
    return result;
}
